home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 126-150 / disk_147 / sys / sysv / sysv.zoo / spawn.c < prev    next >
C/C++ Source or Header  |  1988-07-25  |  2KB  |  75 lines

  1. /*
  2.  * Name:    MicroGnuEmacs
  3.  *        Spawn CLI for System V.
  4.  *
  5.  * Spawn for System V.
  6.  */
  7. #include    "def.h"
  8.  
  9. #include    <signal.h>
  10.  
  11. char    *shellp    = NULL;            /* Saved "SHELL" program.    */
  12. char    *shname = NULL;            /* Saved shell name        */
  13.  
  14. extern    char    *getenv();
  15.  
  16. /*
  17.  * On System V, we no gots job control, so always run
  18.  * a subshell using fork/exec. Bound to "C-C", and used
  19.  * as a subcommand by "C-Z". (daveb)
  20.  *
  21.  * Returns 0 if the shell executed OK, something else if
  22.  * we couldn't start shell or it exited badly.
  23.  */
  24. spawncli(f, n)
  25. {
  26.     extern char    *strrchr();
  27.     register int    pid;
  28.     register int    wpid;
  29.     register int    (*oqsig)();
  30.     register int    (*oisig)();
  31.     int        status;
  32.     int        errp = FALSE;
  33.  
  34.     if (shellp == NULL) {
  35.         shellp = getenv("SHELL");
  36.         if (shellp == NULL)
  37.             shellp = getenv("shell");
  38.         if (shellp == NULL)
  39.             shellp = "/bin/sh";    /* Safer.        */
  40.         shname = strrchr( shellp, '/' ); 
  41.         shname = shname ? shname++ : shellp;
  42.         
  43.     }
  44.     ttcolor(CTEXT);
  45.     ttnowindow();
  46.     ttmove(nrow-1, 0);
  47.     if (epresf != FALSE) {
  48.         tteeol();
  49.         epresf = FALSE;
  50.     }
  51.     ttclose();
  52.     sgarbf = TRUE;                /* Force repaint.    */
  53.     oqsig = signal(SIGQUIT, SIG_IGN);
  54.     oisig = signal(SIGINT,  SIG_IGN);
  55.     if ((pid=fork()) == 0) {
  56.         (void) signal(SIGINT, oisig);
  57.         (void) signal(SIGQUIT, oqsig);
  58.         execlp(shellp, shname, "-i", (char *)NULL);
  59.         _exit(1);            /* Should do better!    */
  60.     }
  61.     else if (pid > 0) {
  62.         while ((wpid=wait(&status))>=0 && wpid!=pid)
  63.             ;
  64.     }
  65.     else errp = TRUE;
  66.  
  67.     signal(SIGINT,  oisig);
  68.     signal(SIGQUIT, oqsig);
  69.     ttopen();
  70.     if(errp)
  71.         ewprintf("Failed to create process");
  72.  
  73.     return ( errp | status );
  74. }
  75.